문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 인라인 함수 (문단 편집) === 인라이닝 강요하기 === 컴파일러에게 특정 함수의 인라이닝을 강요하는 기능은 원래 표준 C/C++에는 없다. 하지만 주요 컴파일러들은 방언으로 그러한 기능을 제공한다. * MSVC의 경우 {{{__forceinline}}}를 함수 선언시 붙여준다. 단 아래의 경우 {{{__forceinline}}}이 붙어도 인라이닝을 하지 않는다. * {{{/Ob0}}}으로 컴파일. (최적화 금지, 디버그 빌드 기본옵션) * 함수와 호출자가 서로 다른 예외처리 방식을 사용할 경우. 하나가 C++ 예외를, 하나가 SEH를 사용할 경우 발생한다.[* 두 예외처리를 지원하기 위한 함수 콜 구조가 다르기 때문이다.] * 가변인수 ({{{va_arg}}})를 가진 경우.[* 콜을 해야 스택 프레임이 쌓인다. 보통 {{{va_arg}}}는 스택 프레임을 포인터로 직접 뒤지는 방식으로 구현되는데, 당연히 콜 없이 인라이닝으로 코드를 삽입해버리면 생기지도 않은 스택 프레임에 접근할 수 없으니 말이 되지 않는다.] * 함수 안에 인라인 어셈블리가 들어가 있고 {{{/Og}}}, {{{/Ox}}}, {{{/O1}}}, {{{/O2}}}로 컴파일하지 않았을 경우.[* 인라이닝을 위해서는 함수 코드에 대해 레지스터를 리디렉션하는 등 상황에 맞는 유연한 기계어 코드 삽입이 필요하다. 함수 내 인라인 어셈블리가 있을 경우 이 역시 수정 대상이 되는데, MSVC의 경우 최적화 옵션 없이는 함부로 인라인 어셈블리 내용을 바꾸지 않으려 들기 때문인 것으로 추정된다.] * 함수가 [[재귀함수]]이고 {{{#pragma inline_recursion(on)}}}로 정의되지 않은 경우. {{{#pragma inline_recursion(on)}}}가 있다면 기본값으로 16단계까지 중첩하여 인라이닝하며 수치를 바꾸려면 {{{#pragma inline_depth(N)}}}을 사용해 N단계로 바꿀 수 있다. * (C++) 가상함수이고 가상으로 불린 경우. 만약 가상으로 불리지 않은 경우 (e.g., {{{Derived::virtual_function()}}} 식으로 강제로 베이스 클래스를 지정한 경우) 는 인라이닝 가능하다.[* 아래 문법적 기능 참고.] * (당연하지만) 함수 포인터를 통한 호출. * {{{__declspec(naked)}}}로 선언된 함수.[* 이 함수들은 스택 프레임이 불완전하게 형성된다. 위 {{{va_arg}}}와 비슷한 상황.] * gcc의 경우 {{{__attribute__((always_inline))}}}를 함수 선언시 붙여준다. 클래스 선언 내에 정의된 함수들은 자동으로 {{{inline}}}이 붙는 것으로 취급된다. 함수를 선언만 하고 클래스 바깥에서 정의할 경우는 해당사항이 없으므로 선언시 {{{inline}}}을 붙여줘야 한다는 점에 유의.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기